﻿#define _CRT_SECURE_NO_WARNINGS


////动态内存管理
//
////malloc和free 
////不初始化
////void* malloc (size_t size)
////void* free(void* ptr)
//free函数⽤来释放动态开辟的内存。
//如果参数 ptr 指向的空间不是动态开辟的，那free函数的⾏为是未定义的。
//如果参数 ptr 是NULL指针，则函数什么事都不做。
// 
//#include<stdio.h>
//#include<stdlib.h>
//#include<errno.h>
//
//
////
////变长数组
////c99标准支持变长数组
////int i=0;
////scanf("%d", &n);//
////int arr[n]={0};
////
//int main()
//{
//	int arr[10] = { 0 };
//	//动态内存开辟
//	int* p = (int*)malloc(40);
//	if (p == NULL)
//	{
//		printf("%s\n", strerror(errno));
//		return 1;
//	}
//	//使用
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		*(p + 1) = i;
//	}
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d ", *(p + 1));
//	}
//
//	//没有free
//	//并不是说内存空间就不回收了
//	//当程序退出的时候，系统会自动回收内存空间的
//
//	free(p);
//	p = NULL;
//
//	return 0;
//}


////calloc//初始化//开辟空间后，会默认为零 初始化，再返回地址
////void* calloc(size_t num, size_t size);//num个大小为size的元素开辟一块空间
//
//#include<stdio.h>
//#include<stdlib.h>
//#include<errno.h>
//
////开辟十个整形的空间
//int main()
//{
//	int* p = (int*)calloc(10, sizeof(int));
//	if (p == NULL)
//	{
//		printf("%s\n", strerror(errno));
//		return 1;
//	}
//    //打印
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d ", *(p + i));
//	}
//	//释放
//	free(p);
//	p = NULL;
//
//	return 0;
//}



//realloc
//void* realloc(void* ptr, size_t size);//ptr是要调整的内存地址//size是调整之后的新的大小
//返回值为调整之后的内存起始位置。
//这个函数调整原内存空间⼤⼩的基础上，还会将原来内存中的数据移动到新的空间。
//realloc在调整内存空间的是存在两种情况：
// 情况1：原有空间之后有足够大的空间
// 情况2：原有空间之后没有足够大的空间
//#include<stdio.h>
//#include<stdlib.h>
//#include<errno.h>
//
//int main()
//{
//	int* p = (int*)malloc(40);
//	if (p == NULL)
//	{
//		printf("%s\n", strerror(errno));
//		return 1;
//	}
//	//使用
//	//1 2 3 4 5 6 7 8 9 10
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		*(p + 1) = i + 1;
//	}
//	//扩容
//	int* ptr = (int*)realloc(p, 80);
//	if (ptr != NULL)
//	{
//		p = ptr;
//	}
//	//使用
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d ", *(p + i));
//	}
//	free(p);
//	p = NULL;
//
//	return 0;
//}


//int main()
//{
//	realloc(NULL, 40);//相当于malloc(40);
//	return 0;
//}